package cn.iocoder.yudao.module.system.dal.mysql.lottery;

import cn.hutool.core.convert.Convert;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.system.dal.dataobject.lottery.LotteryRecordDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.Collections;
import java.util.List;

/**
 * 抽奖记录 Mapper
 *
 * @author 芋道源码
 */
@Mapper
public interface LotteryRecordMapper extends BaseMapperX<LotteryRecordDO> {

    /**
     * 查询用户今日抽奖次数
     *
     * @param userId 用户ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 抽奖次数
     */
    default Long countTodayLotteryByUserId(Long userId, LocalDateTime startTime, LocalDateTime endTime) {
        return selectCount(new LambdaQueryWrapperX<LotteryRecordDO>()
                .eq(LotteryRecordDO::getUserId, userId)
                .between(LotteryRecordDO::getLotteryTime, startTime, endTime));
    }

    /**
     * 查询今日专业版报告中奖次数
     *
     * @param prizeType 奖品类型
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 中奖次数
     */
    default Long countTodayPrizeByType(Integer prizeType, LocalDateTime startTime, LocalDateTime endTime) {
        return selectCount(new LambdaQueryWrapperX<LotteryRecordDO>()
                .eq(LotteryRecordDO::getPrizeType, prizeType)
                .between(LotteryRecordDO::getLotteryTime, startTime, endTime));
    }

    /**
     * 查询用户抽奖记录
     *
     * @param userId 用户ID
     * @return 抽奖记录列表
     */
    default List<LotteryRecordDO> selectListByUserId(Long userId) {
        return selectList(new LambdaQueryWrapperX<LotteryRecordDO>()
                .eq(LotteryRecordDO::getUserId, userId)
                .orderByDesc(LotteryRecordDO::getLotteryTime));
    }

    /**
     * 查询用户已中过的奖励类型（排除未中奖）
     *
     * @param userId 用户ID
     * @return 已中过的奖励类型列表
     */
    default List<Integer> selectWonPrizeTypesByUserId(Long userId) {
        return Convert.toList(Integer.class,
                selectObjs(new LambdaQueryWrapperX<LotteryRecordDO>()
                        .select(Collections.singletonList(LotteryRecordDO::getPrizeType))
                        .eq(LotteryRecordDO::getUserId, userId)
                        .ne(LotteryRecordDO::getPrizeType, 0) // 排除未中奖(0)
                        .groupBy(LotteryRecordDO::getPrizeType)));
    }
}
